package com.dingxin.ship_together_api.config;

import cn.dev33.satoken.session.SaSession;
import cn.dev33.satoken.session.SaSessionCustomUtil;
import cn.dev33.satoken.stp.StpInterface;
import cn.dev33.satoken.stp.StpUtil;
import com.dingxin.ship_together_api.entity.SysMenu;
import com.dingxin.ship_together_api.entity.SysRole;
import com.dingxin.ship_together_api.mapper.SysUserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.*;

/**
 * 自定义权限验证接口扩展 
 */
@Component
public class StpInterfaceImpl implements StpInterface {

    @Autowired
    private SysUserMapper sysUserMapper;

    // 返回一个账号所拥有的权限码集合
    // 检查每次校验权限都会执行一次
    @Override
    public List<String> getPermissionList(Object loginId, String loginType) {

        // 1. 声明权限码集合
        HashSet<String> permissionList = new HashSet<>();
        // 2. 遍历角色列表，查询拥有的权限码
        for (String roleCode : getRoleList(loginId, loginType)) {
            SaSession roleSession = SaSessionCustomUtil.getSessionById("role-" + roleCode);
            Map<String, Object> dataMap = roleSession.getDataMap();
            Set<String> list = roleSession.get(SaSession.PERMISSION_LIST, () -> {
                List<SysMenu> sysMenus = sysUserMapper.selectPermissionsByRoleCode(roleCode);
                HashSet<String> tempList = new HashSet<>();
                for (SysMenu sysMenu : sysMenus) {
                    tempList.add(sysMenu.getCode());
                }
                return tempList;  // 从数据库查询这个角色所拥有的权限列表
            });
            permissionList.addAll(list);
        }
        List<String> strings = new ArrayList<>(permissionList);
        // 3. 返回权限码集合
        return strings;

    }

    // 返回一个账号所拥有的角色标识集合 
    @Override
    public List<String> getRoleList(Object loginId, String loginType) {
        SaSession session = StpUtil.getSessionByLoginId(loginId);
        Map<String, Object> dataMap = session.getDataMap();
        // System.out.println("sessionDataMap = " + dataMap);
        //登出时要对session进行清理，session.clear();
        // List<String> role_list = (List<String>)session.get(SaSession.ROLE_LIST);
        // if (role_list != null) {
        //     return role_list;
        // }
        // //从数据库查询这个账号所拥有的角色列表，并且存入session中
        // List<String> roleList = new ArrayList<>();
        // roleList.add("role-1");
        // session.set(SaSession.ROLE_LIST, roleList);
        // //session.set(SaSession.ROLE_LIST, ...);
        //
        // //返回查询结果
        // return roleList;
        return session.get(SaSession.ROLE_LIST, () -> {
            List<SysRole> sysRoles = sysUserMapper.selectRolesByUserId(loginId);
            List<String> roleList = new ArrayList<>();
            for (SysRole sysRole : sysRoles) {
                roleList.add(sysRole.getCode());
            }
            return roleList; // 从数据库查询这个账号id拥有的角色列表
        });
    }

}
